﻿using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using iNet.IO;
using iNet.Tasks;

namespace iNet.Media.Imaging
{
	/// <summary>
	/// JPEG 無損轉換工作。
	/// </summary>
	public class JpegLosslessTransformTask : Task
	{
		#region 欄位
		string _DestinationFilePath;
		string _SourceFilePath;
		JpegLosslessTransform _Transform = JpegLosslessTransform.None;
		#endregion
		#region 建構子
		/// <summary>
		/// 初始化新的 JpegLosslessTransformTask 執行個體。
		/// </summary>
		public JpegLosslessTransformTask()
		{ }
		/// <summary>
		/// 初始化新的 JpegLosslessTransformTask 執行個體。
		/// </summary>
		/// <param name="srcFilePath">JPEG 來源檔案路徑。</param>
		/// <param name="destFilePath">轉換後的 JPEG 檔案路徑。</param>
		/// <param name="transform">套用的 JPEG 轉換。</param>
		public JpegLosslessTransformTask(string srcFilePath, string destFilePath, JpegLosslessTransform transform)
		{
			_SourceFilePath = srcFilePath;
			_DestinationFilePath = destFilePath;
			_Transform = transform;
		}
		/// <summary>
		/// 初始化新的 JpegLosslessTransformTask 執行個體。
		/// </summary>
		/// <param name="filePath">JPEG 檔案路徑。</param>
		/// <param name="transform">套用的 JPEG 轉換。</param>
		public JpegLosslessTransformTask(string filePath, JpegLosslessTransform transform)
			: this(filePath, filePath, transform)
		{ }
		#endregion
		#region DestinationFilePath
		/// <summary>
		/// 取得或設定轉換後的 JPEG 檔案路徑。
		/// </summary>
		public string DestinationFilePath
		{
			get
			{
				return _DestinationFilePath;
			}
			set
			{
				this.SetInitializingParameter<string>(ref _DestinationFilePath, value);
			}
		}
		#endregion
		#region Execute
		/// <summary>
		/// 執行工作。
		/// </summary>
		/// <param name="version">工作版本。</param>
		/// <returns>True 表示工作執行成功或已取消，False 表示失敗。</returns>
		protected override bool Execute(TaskVersion version)
		{
			//取得資料
			JpegLosslessTransform transform;
			string srcPath, destPath;
			if (!this.ReadValue<JpegLosslessTransform>(version, ref _Transform, out transform)
				|| !this.ReadValue<string>(version, ref _SourceFilePath, out srcPath)
				|| !this.ReadValue<string>(version, ref _DestinationFilePath, out destPath))
			{
				return true;
			}

			//確認檔案是否存在
			if (!File.Exists(srcPath))
				return false;

			//套用轉換
			if (transform != JpegLosslessTransform.None)
			{
				FreeImage.JpegOperation operation;
				switch (transform)
				{
					case JpegLosslessTransform.Rotate90:
						operation = FreeImage.JpegOperation.Rotate90;
						break;
					case JpegLosslessTransform.Rotate180:
						operation = FreeImage.JpegOperation.Rotate180;
						break;
					case JpegLosslessTransform.Rotate270:
						operation = FreeImage.JpegOperation.Rotate270;
						break;
					case JpegLosslessTransform.FlipX:
						operation = FreeImage.JpegOperation.FlipX;
						break;
					case JpegLosslessTransform.FlipY:
						operation = FreeImage.JpegOperation.FlipY;
						break;
					default:
						return false;
				}
				return FreeImage.JpegTransform(srcPath, destPath, operation, false);
			}
			else if (!PathComparer.Default.Equals(srcPath, destPath))
				File.Copy(srcPath, destPath);
			return true;
		}
		#endregion
		#region SourceFilePath
		/// <summary>
		/// 取得或設定 JPEG 來源檔案路徑。
		/// </summary>
		public string SourceFilePath
		{
			get
			{
				return _SourceFilePath;
			}
			set
			{
				this.SetInitializingParameter<string>(ref _SourceFilePath, value);
			}
		}
		#endregion
		#region Transform
		/// <summary>
		/// 取得或設定套用的 JPEG 轉換，預設值為 JpegLosslessTransform.None。
		/// </summary>
		public JpegLosslessTransform Transform
		{
			get
			{
				return _Transform;
			}
			set
			{
				this.SetInitializingParameter<JpegLosslessTransform>(ref _Transform, value);
			}
		}
		#endregion
		#region ValidateInitParameters
		/// <summary>
		/// 驗證初始化參數是否正確。
		/// </summary>
		/// <returns>True 表示參數正確，False 表示錯誤。</returns>
		protected override bool ValidateInitParameters()
		{
			return (base.ValidateInitParameters()
				&& _Transform.IsDefined()
				&& !string.IsNullOrEmpty(_SourceFilePath)
				&& !string.IsNullOrEmpty(_DestinationFilePath)
				&& FileUtility.IsValidPath(_SourceFilePath)
				&& FileUtility.IsValidPath(_DestinationFilePath)
			);
		}
		#endregion
	}
	#region JpegLosslessTransform
	/// <summary>
	/// 表示 JPEG 無損轉換。
	/// </summary>
	public enum JpegLosslessTransform
	{
		/// <summary>
		/// 無任何轉換。
		/// </summary>
		None,
		/// <summary>
		/// 水平鏡射。
		/// </summary>
		FlipX,
		/// <summary>
		/// 垂直鏡射。
		/// </summary>
		FlipY,
		/// <summary>
		/// 順時鐘旋轉 90 度。
		/// </summary>
		Rotate90,
		/// <summary>
		/// 順時鐘旋轉 180 度。
		/// </summary>
		Rotate180,
		/// <summary>
		/// 順時鐘旋轉 270 度，即逆時鐘旋轉 90 度。
		/// </summary>
		Rotate270,
	}
	#endregion
}
